GskGLDriver: Use float for texture size in create_texture
authorTimm Bäder <mail@baedert.org>
Wed, 15 Nov 2017 17:40:57 +0000 (18:40 +0100)
committerTimm Bäder <mail@baedert.org>
Thu, 21 Dec 2017 17:25:52 +0000 (18:25 +0100)
Render nodes can end up with bounds < 1 since they are floats, and the
implicit cast to int ends up creating a texture with 0 width or height.
Use ceil() instead in create_texture so we don't have to do that on the
caller side everywhere.

gsk/gskgldriver.c
gsk/gskgldriverprivate.h
gsk/gskglrenderer.c

index 68c9148aea834ddedddbd470bc93cbc148cf717f..a758c2de2fecf5a76a1d64a9deb767643e5beeac 100644 (file)
@@ -389,11 +389,13 @@ find_texture_by_size (GHashTable *textures,
 
 static Texture *
 create_texture (GskGLDriver *driver,
-                int          width,
-                int          height)
+                float        fwidth,
+                float        fheight)
 {
   guint texture_id;
   Texture *t;
+  int width = ceilf (fwidth);
+  int height = ceilf (fheight);
 
   if (width >= driver->max_texture_size ||
       height >= driver->max_texture_size)
@@ -456,7 +458,7 @@ gsk_gl_driver_get_texture_for_texture (GskGLDriver *driver,
       if (t->min_filter == min_filter && t->mag_filter == mag_filter)
         return t->texture_id;
     }
-  
+
   t = create_texture (driver, gdk_texture_get_width (texture), gdk_texture_get_height (texture));
 
   if (gdk_texture_set_render_data (texture, driver, t, gsk_gl_driver_release_texture))
@@ -476,8 +478,8 @@ gsk_gl_driver_get_texture_for_texture (GskGLDriver *driver,
 
 int
 gsk_gl_driver_create_texture (GskGLDriver *driver,
-                              int          width,
-                              int          height)
+                              float        width,
+                              float        height)
 {
   Texture *t;
 
@@ -644,8 +646,7 @@ gsk_gl_driver_create_render_target (GskGLDriver *driver,
 
   g_array_append_val (t->fbos, f);
 
-  g_assert (glCheckFramebufferStatus (GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
-
+  g_assert_cmpint (glCheckFramebufferStatus (GL_FRAMEBUFFER), ==, GL_FRAMEBUFFER_COMPLETE);
   glBindFramebuffer (GL_FRAMEBUFFER, driver->default_fbo.fbo_id);
 
   return fbo_id;
index 955a2a8a990f892fb5d9648fe9ffd02fda8f5c64..5a138b17897ec5a1724fadf1b4ff557a30eae1d1 100644 (file)
@@ -28,8 +28,8 @@ int             gsk_gl_driver_get_texture_for_texture   (GskGLDriver     *driver
                                                          int              min_filter,
                                                          int              mag_filter);
 int             gsk_gl_driver_create_texture            (GskGLDriver     *driver,
-                                                         int              width,
-                                                         int              height);
+                                                         float            width,
+                                                         float            height);
 int             gsk_gl_driver_create_vao_for_quad       (GskGLDriver     *driver,
                                                          int              position_id,
                                                          int              uv_id,
index 88ee17bf24447ac5a5e58300a4b9a5d96adf9f28..7634359f9c1aef74d3b91c578604dada151a7e53 100644 (file)
@@ -979,8 +979,8 @@ gsk_gl_renderer_add_render_item (GskGLRenderer           *self,
         cairo_t *cr;
 
         surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
-                                              item.size.width * self->scale_factor,
-                                              item.size.height * self->scale_factor);
+                                              ceilf (item.size.width) * self->scale_factor,
+                                              ceilf (item.size.height) * self->scale_factor);
         cairo_surface_set_device_scale (surface, self->scale_factor, self->scale_factor);
         cr = cairo_create (surface);